package DAO;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import to.Lancamento;
import to.Pessoa;
import to.SolicitacaoDeAnalise;
import to.Usuario;
import util.HibernateUtil;

public class PessoaDAO implements Serializable {

	public Pessoa buscarSalvar(Pessoa pessoaPesquisar) throws Exception {
		Pessoa pessoa = new Pessoa();
		Session session = null;
		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Pessoa.class);
			criteria.add(Restrictions.idEq(pessoaPesquisar.getCodigo()));
			pessoa = (Pessoa) criteria.uniqueResult();
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		return pessoa;
	}

	public Pessoa pesquisarCPF(String cpf) throws Exception {
		Pessoa retorno = null;
		try {
			Session session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Pessoa.class);
			criteria.add(Restrictions.eq("cpf_cnpj", cpf));
			criteria.setMaxResults(1);
			retorno = (Pessoa) criteria.uniqueResult();
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		return retorno;
	}


	public List<Pessoa> buscaTodos() throws Exception {
		List<Pessoa> listaRetorno = null;
		try {
			Session session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Pessoa.class);

			criteria.addOrder(Order.asc("nome"));
			listaRetorno = (List<Pessoa>) criteria.list();
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		return listaRetorno;
	}

	public Pessoa pesquisarUsuarioPessoa(Usuario user) throws Exception {
		Pessoa pessoa = null;
		Session session = null;
		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Pessoa.class, "pess")
					.createAlias("pess.usuario", "usu");
			criteria.add(Restrictions.like("pess.usuario", user));
			pessoa = (Pessoa) criteria.uniqueResult();
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		} finally {
			session.close();
		}
		return pessoa;
	}

	public List<SolicitacaoDeAnalise> buscarSolicitacaoPessoa(Pessoa pessoa)
			throws Exception {
		Session session = null;
		List<SolicitacaoDeAnalise> listaRetorno = null;
		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session
					.createCriteria(SolicitacaoDeAnalise.class);
			criteria.add(Restrictions.eq("pessoa", pessoa));
			criteria.addOrder(Order.asc("status"));
			listaRetorno = (List<SolicitacaoDeAnalise>) criteria.list();
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		return listaRetorno;
	}

	public ArrayList<Lancamento> buscarTodosPorPessoa(Pessoa pessoa)
			throws Exception {
		ArrayList<Lancamento> retornaLancamento = new ArrayList<Lancamento>();
		Session session = null;
		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session
					.createCriteria(Lancamento.class, "lanca")
					.createAlias("lanca.solicitacao", "solici")
					.createAlias("solici.pessoa", "pesso");
			criteria.add(Restrictions.eq("pesso.codigo", pessoa.getCodigo()));
			criteria.addOrder(Order.desc("lanca.dataEmissao"));
			criteria.addOrder(Order.desc("lanca.dataPagamento"));
			retornaLancamento = (ArrayList<Lancamento>) criteria.list();
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		} finally {
			session.close();
		}
		return retornaLancamento;
	}

}
